var express = require('express');
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const UserModel = require('../db/models/UserModel')
const role_check=require('./role')

var router = express.Router();
const secretOrPrivateKey = 'suibian'//秘钥  可以配置到环境变量 比如package.json中 读取过来




/* 获取用户列表 接口级权限*/
router.get('/userList', role_check, async function (req, res, next) {
    // console.log('权限是:'+req.role,9999);
    const list = await UserModel.find()
    res.send(list)
});


// 注册
router.post('/register', async (req, res) => {
    // console.log(req.body);
    let { username, password, name, role } = req.body// 获取传入参数username,password,name,role
    if (!username || !password || !name) {// 判断是否输入
        return res.status(409).send(`username或password或name不能为空,请填写`)
    }
    const user = await UserModel.findOne({ username })
    if (user) {//判断用户是否已存在 如果存在 直接返回409
        return res.status(409).send(`${username}该用户已存在`)
    }
    // const newUser = await UserModel.create({username,password,name,role})
    const newUser = await UserModel.create(req.body)//添加用户, 可以直接把req.body 当做表的字段
    res.send({ msg: '注册成功', data: newUser })
})



// 登录
router.post('/login', async (req, res) => {
    let { username, password } = req.body
    const user = await UserModel.findOne({ username })//查询用户
    if (!user) {//判断用户是否已存在
        return res.status(422).send(`${username}该用户不存在,请注册`)
    }
    // 如果用户存在，则利用bcrypt解密 判断密码是否正确 
    const isPassword = await bcrypt.compareSync(password, user.password)//
    if (!isPassword) {
        res.status(422).send(`${password}密码不正确`)
    }

    // 生成token 并返回token
    const { _id, name, role } = user
    //生成token
    const token = jwt.sign({ _id, username }, secretOrPrivateKey, { expiresIn: '24h' })
    res.send({ token, username, name, role })
})



// 验证
router.get('/verify', async (req, res) => {
    if (!req.headers.authorization) {
        return res.status(408).send({ code: 408, msg: '没有接收到token' })
    }
    const token = req.headers.authorization.split('Bearer ').pop()//得到请求头中的 token 
    const { _id } = await jwt.verify(token, secretOrPrivateKey)// 解析token 返回生成token之前传入的payload混淆参数  , 并解构赋值拿到id
    res.send(_id)
})



module.exports = router;
